package com.suray.wcs.res.enums;

/**
 * @author 作者 ideal
 * @version 创建时间：2019年2月16日 下午6:20:17
 */
public enum Order {
    /**
     * 托盘取货
     */
    PALLET_UP(0x01, 1, "托盘取货"),

    /**
     * 托盘放货
     */
    PALLET_DOWN(0x02, 1, "托盘放货"),
    /**
     * 开始充电
     */
    START_CHARGE(0x03, 1, "开始充电"),
    /**
     * 关闭充电
     */
    CLOSE_CHARGE(0x04, 1, "关闭充电"),
    /**
     * 换向坡道
     */
    CHANGE_TO_RAMP(0x05, 1, "换向坡道"),
    /**
     * 换向巷道
     */
    CHANGE_TO_ROADWAY(0x06, 1, "换向巷道"),

    // 0x07 没有
    /**
     * 托盘校准
     */
    CALIBRATION_PALLET(0x08, 1, "托盘校准"),
    /**
     * 托盘校准+顶升
     */
    CALIBRATION_PALLET_UP(0x09, 1, "托盘校准+顶升"),
    /**
     * 1方向按距离行驶
     */
    RUN_WITH_DISTANCE_ONE(0x11, 1, "1方向按距离行驶"),
    /**
     * 2方向按距离行驶
     */
    RUN_WITH_DISTANCE_TWO(0x12, 1, "2方向按距离行驶"),
    /**
     * 3方向按距离行驶
     */
    RUN_WITH_DISTANCE_THREE(0x13, 1, "3方向按距离行驶"),
    /**
     * 4方向按距离行驶
     */
    RUN_WITH_DISTANCE_FOUR(0x14, 1, "4方向按距离行驶"),
    /**
     * 同步小车时间
     */
    SYNC_TIME(0xCD, 1, "同步时间"),//0x15异步指令改成0xCD同步指令
    /**
     * 1方向长感应停
     */
    STOP_WITH_DISTANCE_ONE(0x31, 1, "1方向长感应停"),
    /**
     * 2方向长感应停
     */
    STOP_WITH_DISTANCE_TWO(0x32, 1, "2方向长感应停"),
    /**
     * 3方向长感应停
     */
    STOP_WITH_DISTANCE_THREE(0x33, 1, "3方向长感应停"),
    /**
     * 4方向长感应停
     */
    STOP_WITH_DISTANCE_FOUR(0x34, 1, "4方向长感应停"),
    /**
     * 1方向按速度行驶
     */
    RUN_WITH_SPEED_ONE(0x61, 1, "1方向按速度行驶停"),
    /**
     * 2方向按速度行驶
     */
    RUN_WITH_SPEED_TWO(0x62, 1, "2方向按速度行驶停"),
    /**
     * 3方向按速度行驶停
     */
    RUN_WITH_SPEED_THREE(0x63, 1, "3方向按速度行驶停"),
    /**
     * 4方向按速度行驶停
     */
    RUN_WITH_SPEED_FOUR(0x64, 1, "4方向按速度行驶停"),
    /**
     * 油泵按速度正转
     */
    OIL_PUMP_REVERSAL(0x45, 1, "油泵按速度正转"),
    /**
     * 油泵按速度反转
     */
    OIL_PUMP_FORWARD(0x46, 1, "油泵按速度反转"),
    /**
     * 更改坐标
     */
    CHANGE_LOCATION(0x50, 1, "更改坐标"),
    /**
     * 手动校准（小车坐标更新成所给坐标穿梭车根据当前位置的坐标属性，采用与之对应的校准
     * 方式进行校准）
     */
    MANUAL_CALIBRATION(0x51, 1, "手动校准"),
    /**
     * 校准位置并验证条码
     */
    CALIBRATION_NODE(0x60, 1, "校准位置并验证条码"),
    /**
     * 紧急停止
     */
    EMERGENCY_STOP(0x81, 0, "紧急停止"),
    /**
     * 暂停恢复
     */
    PAUSE_RECOVER(0x82, 0, "暂停恢复"),
    /**
     * 更改小车行驶速度
     */
    CHANGE_SPEED(0x83, 0, "更改小车行驶速度"),
    /**
     * 更改小车特殊位置行驶速度
     * 若行驶路径中包含提升机，输送线，充电桩时，所需行驶速度
     */
    CHANGE_SPECIAL_SPEED(0x84, 0, "更改小车特殊位置行驶速度"),
    /**
     * 打开蜂鸣器
     */
    OPEN_ALARM(0x85, 0, "打开蜂鸣器"),
    /**
     * 关闭蜂鸣器
     */
    CLOSE_ALARM(0x86, 0, "关闭蜂鸣器"),
    /**
     * 将行驶中的小车暂停，保留任务
     */
    PAUSE_RUN(0x87, 0, "暂停行驶"),
    /**
     * 小车按照速度停止
     */
    STOP_WITH_SPEED(0x88, 0, "小车按照速度停止"),

    /**
     * 打开刹车
     */
    OPEN_BRAKE(0x89, 0, "打开刹车"),
    /**
     * 关闭刹车
     */
    CLOSE_BRAKE(0x8a, 0, "关闭刹车"),
    /**
     * 清空换向驱动器错误
     */
    CLEAR_ERROR_DIRECT_DRIVER(0x8b, 0, "清空换向驱动器错误"),
    /**
     * 清空行驶驱动器错误
     */
    CLEAR_ERROR_DRIVER(0x8d, 0, "清空行驶驱动器错误"),
    /**
     * WCS刚启动时，会给小车下发初始化指令，清空小车的任务
     */
    INITIALIZE(0x8e, 0, "初始化"),
    /**
     * 任务撤销
     */
    CANCEL(0x8f, 0, "任务撤销"),

    /**
     * 下发段序号
     */
    SEND_SEGMENT_NO(0x90, 0, "下发段序号"),
    /**
     * 查询小车上方是否有货
     */
    CHECK_PALLET(0x91, 0, "查询小车上方是否有货"),
    /**
     * 发送当前提升机层数
     */
    CUR_LIFT_LAYER(0x92, 0, "发送当前提升机层数"),
    /**
     * 保存行驶参数
     */
    SAVE_DRIVING_PARAM(0x93, 0, "保存行驶参数"),

    /**
     * 保存升降参数
     */
    SAVE_LIFT_PARAM(0x94, 0, "保存升降参数"),

    /**
     * 小车系统关机(接收该指令5s后关机)
     */
    RGV_SHUT_DOWN(0x96, 0, "小车系统关机"),
    /**
     * 小车系统重启(接收该指令5s后重启)
     */
    RGV_RESTART(0x97, 0, "小车系统重启"),
    /**
     * 发送地图
     */
    SEND_MAP(0x98, 0, "发送地图"),

    /**
     * 电量
     */
    BATTERY_LEVEL(0x99, 0, "电量"),

    /**
     *设置单个参数
     */
    SET_SINGLE_PARAMETER(0x9D, 0, "设置单个参数"),
    /**
     * 更新res固件
     */
    UPDATE_RES_FIRMWARE(0xA4, 0, "更新res固件"),

    /**
     * 更新行驶固件
     */
    UPDATE_DRIVER_FIRMWARE(0xA5, 0, "更新行驶固件"),

    /**
     * 更新油泵固件
     */
    UPDATE_OIL_PUMP_FIRMWARE(0xA6, 0, "更新油泵固件"),

    /**
     * 提取WCS日志
     */
    EXTRACT_WCS_LOG(0xA7, 0, "提取WCS日志"),

    /**
     * 提取KCS日志
     */
    EXTRACT_KCS_LOG(0xA8, 0, "提取KCS日志"),

    /**
     * 提取油泵日志
     */
    EXTRACT_OIL_PUMP_LOG(0xAA, 0, "提取行驶日志"),

    /**
     * 提取行驶日志
     */
    EXTRACT_DRIVER_LOG(0xA9, 0, "提取油泵日志"),

    /**
     * 提取WCS备份日志
     */
    EXTRACT_WCS_BACK_UP_LOG(0xAC, 0, "提取WCS备份日志"),

    /**
     * 提取KCS备份日志
     */
    EXTRACT_KCS_BACK_UP_LOG(0xAD, 0, "提取KCS备份日志"),

    /**
     * 提取油泵备份日志
     */
    EXTRACT_OIL_PUMP_BACK_UP_LOG(0xAF, 0, "提取行驶备份日志"),

    /**
     * 提取行驶备份日志
     */
    EXTRACT_DRIVER_BACK_UP_LOG(0xAE, 0, "提取油泵备份日志"),

    /**
     *位移量清零
     */
    DISPLACEMENT_CLEARING(0x8C, 0, "位移量清零"),

    /**
     * 获取单个参数
     */
    GET_SINGLE_PARAMETER(0x9E, 0, "获取单个参数"),

    /**
     *获取位移量
     */
    GET_DISPLACEMENT(0xAB, 0, "获取位移量"),

    /**
     * 获取行驶驱动器扭矩
     */
    GET_DRIVING_TORQUE(0xB0, 0, "获取行驶驱动器扭矩"),

    /**
     * 主动保存scada信息指令
     */
    SAVE_SCADA_INFORMATION(0xB1, 0, "主动保存scada信息指令"),

    /**
     * 获取油泵驱动器扭矩
     */
    GET_PUMP_DRIVING_TORQUE(0xB2, 0, "获取油泵驱动器扭矩"),

    /**
     * 重启行驶单片机
     */
    RESTART_DRIVING_SINGLECHIP(0xB3, 0, "重启行驶单片机"),

    /**
     * 重启升降单片机
     */
    RESTART_LIFT_SINGLECHIP(0xB4, 0, "重启升降单片机"),

    /**
     * 获取条码像素点
     */
    GET_CODEBAR_POINT(0xB5, 0, "获取条码像素点"),

    /**
     * 获取条码值
     */
    GET_CODEBAR_VALUE(0xB6, 0, "获取条码值"),

    /**
     * 打印行驶激光打印
     */
    PRINT_DRIVING_LASER(0xB7, 0, "打印行驶激光打印"),

    /**
     * 获取油泵编码器数据
     */
    GET_PUMP_ENCODE_DATA(0xB9, 0, "获取油泵编码器数据"),

    /**
     * 设置小车设备id
     */
    SET_RGV_ID(0xBC, 0, "设置小车设备id"),

    /**
     * 重启1052单片机
     */
    RESTART_1052_SINGLECHIP(0xBD, 0, "重启1052单片机"),

    /**
     * 获取地图版本
     */
    GET_MAP_VERSION(0xBE, 0, "获取地图版本"),

    /**
     * 获取res版本
     */
    GET_RES_VERSION(0xBB, 0, "获取res版本"),

    /**
     * 获取升降版本
     */
    GET_LIFT_VERSION(0xBA, 0, "获取升降版本"),

    /**
     * 获取行驶版本
     */
    GET_DRIVING_VERSION(0xA3, 0, "获取形式版本"),

    /**
     * 升降调试锁功能
     */
    LIFT_LOCK_FUNK(0xC5, 0, "升降调试锁功能"),

    /**
     * 设置5.4TSY显示屏车号
     */
    SET_5TSY_ID(0xC6, 0, "设置5.4TSY显示屏车号"),

    /**
     * 提取升降程序
     */
    GET_LIFT_PROGRAM(0xCC, 0, "提取升降程序"),

    /**
     * 提取行驶程序
     */
    GET_DRIVING_PROGRAM(0xCB, 0, "提取行驶程序"),

    /**
     * 提取res程序
     */
    GET_RES_PROGRAM(0xCA, 0, "提取res程序"),

    /**
     * 提取地图
     */
    GET_MAP(0xC9, 0, "提取地图"),

    /**
     * 获取行驶参数
     */
    GET_DRIVING(0x9A, 0,"获取行驶参数"),

    /**
     * 获取油泵参数
     */
    GET_LIFT(0x9B, 0, "获取油泵参数"),

    /**
     * 获取res参数
     */
    GET_RES(0xa2, 0, "获取res参数"),
    /**
     * 通过指令获取托盘条码（RFID） -- PLC专用，指令下发，返回结果解析长度为8个字节（正常调试指令为4个字节）
     */
    BA(0xBA, 0, "BA"),

    /**
     * 获取条码值校准时间
     */
    GET_CALIBRATION_GROUNDCODE_TIME(0XD3,0,"获取条码值校准时间"),

    //RGV 60
    CHANGE_MAP(0xFF01, 0, "切换地图"),

    //RGV ROLLER
    WAIT_HAS_CARGO(0xFF02, 0, "等待取货完成"),

    //RGV ROLLER
    WAIT_NO_CARGO(0xFF03, 0, "等待放货完成"),

    //RGV ROLLER
    ROLLER_STOP(0xFF04, 0, "滚筒停止转动"),

    //RGV FORK
    FORK_UP(0xFF05, 0, "叉车顶升"),
    FORK_GET_CARGO(0xFF06, 0, "叉车取货"),
    FORK_PUT_CARGO(0xFF07, 0, "叉车放货"),
    FORK_DOWN(0xFF08, 0, "叉车下降"),
    FORK_LIFT(0xFF09, 0, "货叉升降"),
    ;

    private int orderByte;
    /**
     * 指令类型 0. 同步 1. 异步
     */
    private Integer orderType;
    private String orderDescribe;

    /**
     * 指令
     *
     * @param orderByte     字节
     * @param orderType     类型
     * @param orderDescribe 描述
     */
    Order(int orderByte, Integer orderType, String orderDescribe) {
        this.orderByte = orderByte;
        this.orderType = orderType;
        this.orderDescribe = orderDescribe;
    }

    public int getOrderByte() {
        return orderByte;
    }

    public void setOrderByte(int orderByte) {
        this.orderByte = orderByte;
    }

    public String getOrderDescribe() {
        return orderDescribe;
    }

    public void setOrderDescribe(String orderDescribe) {
        this.orderDescribe = orderDescribe;
    }

    public static Order parseOrder(int orderByte) {
        for (Order r : Order.values()) {
            if (r.getOrderByte() == orderByte) {
                return r;
            }
        }
        throw new IllegalArgumentException("任务指令参数异常");
    }

    public Integer getOrderType() {
        return orderType;
    }

    public void setOrderType(Integer orderType) {
        this.orderType = orderType;
    }
}
